# coding=utf-8
import os
import time
import sys


class Common(object):

    def __init__(self):
        self.param_dict = {}
        self.robots = []
        self.workspace = self.get_jenkins_environ("WORKSPACE")
        self.build_id = str(self.get_jenkins_environ("BUILD_ID"))

    # 获取Jenkins传入的变量，格式：
    # pybot.bat --outputdir "%WORKSPACE%\result\%BUILD_ID%\1"  "%WORKSPACE%\重构工作流接口自动化测试_ERP352SP8\接口场景自动化用例"
    # pabot --processes 4 --variable remote_url:"http://192.168.99.100:4444/wd/hub" --outputdir "%WORKSPACE%\result\%BUILD_ID%\1" "%WORKSPACE%\工作流场景自动化测试"
    def get_param_from_jenkins(self):
        # param_from_jenkins = ['D:\\PycharmProjects\\Mult_SeleniumGrid\\testrun.py', '--processes', '4', '--variable', 'remote_url:http://192.168.99.100:4444/wd/hub', '--outputdir', '%WORKSPACE%\\re sult\\%BUILD_ID%\\1', '%WORKSPACE%\\工作流场景自动化测试']
        param_from_jenkins = sys.argv
        # param_from_jenkins = ['D:\\PycharmProjects\\Mult_SeleniumGrid\\testrun.py', '--processes', '4', '--variable',
        #                      'remote_url:http://192.168.99.100:4444/wd/hub', '--outputdir',
        #                      'D:\\Jenkins\\workspace\\01_持续集成UI自动化\\result\\10',
        #                      'D:\\Jenkins\\workspace\\重构工作流接口自动化测试_ERP352SP8\\接口场景自动化用例']

        # 最后一个参数整个测试套件
        self.param_dict["testSuite"] = param_from_jenkins[-1]
        # 获取param_from_jenkins中除了第一个和最后一个的其他参数
        other_param = param_from_jenkins[1:-1]
        # 通过zip方式，将从0开始，步长为2。与从1开始步长为2的元素压缩，然后转换为字典形式
        other_dict = dict(zip(other_param[0::2], other_param[1::2]))
        self.param_dict.update(other_dict)
        # 读取Jenkins环境变量后，替换WORKSPACE和BUILD_ID变量为实际数据
        # workspace = self.get_jenkins_environ("WORKSPACE")
        # build_id = str(self.get_jenkins_environ("BUILD_ID"))
        for k, v in self.param_dict.items():
            if "%WORKSPACE%" in v and self.workspace is not None:
                self.param_dict[k] = v.replace("%WORKSPACE%", self.workspace)
            if "%BUILD_ID%" in v and self.build_id is not None:
                self.param_dict[k] = v.replace("%BUILD_ID%", self.build_id)
        print(self.param_dict)
        # param_dict = {'testSuite': 'D:\\Jenkins\\workspace\\工作流接口自动化\\重构工作流接口自动化测试_ERP352SP9_py3\\接口场景自动化用例','--outputdir': 'D:\\Jenkins\\workspace\\工作流接口自动化\\result\\25\\1'}
        return self.param_dict

    def get_jenkins_environ(self, key):
        """
        获取Jenkins环境变量中的特定变量，比如WORKSPACE，BUILD_ID等
        :value key:WORKSPACE,BUILD_ID等
        :return:
        """
        try:
            value = os.environ[key]
        except KeyError:
            value = None
            print(f"没有获取到{key}的参数")
        return value

    def get_all_file(self, init_suite, testSuite):
        """
        :param init_suite: 变动的文件夹层级
        :param testSuite: 固定的测试套件顶层目录
        :return:
        ["--suite 接口场景自动化用例.71调整流程.76有临时步骤的调整流程 --test 接口场景自动化用例.71调整流程.76有临时步骤的调整流程.* D:\Jenkins\workspace\工作流接口自动化\重构工作流接口
自动化测试_ERP352SP9_py3\接口场景自动化用例",....]
        """
        allfilelist = os.listdir(init_suite)
        for f in allfilelist:
            filepath = os.path.join(init_suite, f)
            if os.path.isdir(filepath):
                self.get_all_file(filepath, testSuite)
            # 遍历文件名，如果是以.robot结尾，则加入列表
            if f.endswith(".robot"):
                params = self.get_suite_and_test_param(testSuite, filepath) + f" {testSuite}"
                self.robots.append(params)
        return self.robots

    # 获取testsuite下的所有.robot的文件
    def get_robot_file(self, param_dict):
        self.param_dict = param_dict
        init_suite = self.param_dict["testSuite"]
        robot_files: list = self.get_all_file(init_suite, init_suite)
        # print(robot_files)
        return robot_files

    def get_suite_and_test_param(self, testSuite, robotFiles):
        # --suite和 - -test的开始层级必须一致且需要用【.】分层，最后完整目录结束必须与suite和test的开始一致
        # rpartition从右边开始截取识别字符进行截取，得到【D:\Jenkins\workspace\工作流接口自动化\重构工作流接口自动化测试_ERP352SP9_py3\】
        diff = testSuite.rpartition("\\")[0] + "\\"
        # 然后替换掉此差异，得到test和suite初步参数：【接口场景自动化用例\01发起流程\01发起接口.robot】
        param_test = robotFiles.replace(diff, "")
        # 改造参数，得到param_suite=接口场景自动化用例.01发起流程.01发起接口  param_test=接口场景自动化用例.01发起流程.01发起接口.*
        param_test = param_test.replace("\\", ".")
        param_test = param_test.replace(".robot", ".*")
        param_suite = param_test.rpartition(".")[0]
        # 最终得到参数： --suite 接口场景自动化用例.01发起流程.01发起接口 --test 接口场景自动化用例.01发起流程.01发起接口.*
        param = f"--suite {param_suite} --test {param_test}"
        print(param)
        return param

    # 删除硬盘中合并前的测试报告
    def clean_logs(self):
        dir_list = []
        path = os.getcwd() + '\\resultDir\\'
        # 获取当前目录下所有文件和文件夹
        files = os.listdir(".\\resultDir")
        for file in files:
            file = path + file
            if os.path.isdir(file):
                # 文件夹path放入dir_list
                dir_list.append(file)
        if dir_list:
            for dire in dir_list:
                # 删除文件夹及其下文件
                cmd = "rd /S /Q" + dire
                os.system(cmd)

    def get_cur_time(self):
        return time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))

# com = Common()
# print(com.get_param_from_jenkins())
# print(com.get_cur_time())
